package matrix;

/**
 * Интерфейс механизма хранения {@linkplain matrix.ICell Ячеек} (массив, коллекция,..).
 * Введён для отделения операций с конкретным хранилищем {@linkplain matrix.ICell Ячеек} от операций с конкретной Областью.  
 * @see {@literal Фримен Эр., Фримен Эл. - "Паттерны проектирования", глава 1} 
 */
public interface IRangeStorage {
	/**
	 * Добавляет заданную {@linkplain matrix.ICell Ячейку} в {@linkplain matrix.IRangeStorage Хранилище} по заданному адресу (строка, столбец).
	 * Полезен при инициализации (заполнении) {@linkplain matrix.IRangeStorage Хранилища}.
	 * @param aCell {@linkplain matrix.ICell ICell} - ячейка, которую нужно добавить.
	 * @param aRow int - строка, в которую необходимо добавить {@linkplain matrix.ICell Ячейку}.
	 * @param aColumn int -столбец, в который необходимо добавить {@linkplain matrix.ICell Ячейку}.
	 * @throws IllegalArgumentException метод должен генерировать эту ошибку если:
	 * <li> aRow или aColumn меньше 1
	 * <li> aRows или aColumns больше {@linkplain matrix.IRange#rows() rows()} ({@linkplain matrix.IRange#columns() columns()})
	 */
	abstract void addCell(ICell aCell, int aRow, int aColumn);
	/**
	 * Возвращает {@linkplain matrix.IRangeIterator Итератор}, позволяющий пробежать по {@linkplain matrix.ICell Ячейкам} заданной {@linkplain matrix.IRange подОбласти} {@linkplain matrix.IRangeStorage Хранилища}.
	 * @param aRow int - начальная строка 
	 * @param aColumn int - начальный столбец
	 * @param aRows int - количество строк
	 * @param aColumns int - количество столбцов
	 * @return {@linkplain matrix.IRangeIterator IRangeIterator}
	 * @throws IllegalArgumentException метод должен генерировать эту ошибку если:
	 * <li> aRow или aColumn меньше 1
	 * <li> aRow+aRows-1 или aColumn+aColumns-1 больше {@linkplain matrix.IRange#rows() rows()} ({@linkplain matrix.IRange#columns() columns()})
	 */
	abstract IRangeIterator iterator(int aRow, int aColumn, int aRows, int aColumns);
	/**
	 * Возвращяет {@linkplain matrix.ICell Ячейку} в {@linkplain matrix.IRangeStorage Хранилище} по заданному адресу (строка, столбец).
	 * @param aRow int - строка 
	 * @param aColumn int - столбец
	 * @return {@linkplain matrix.ICell ICell}
	 * <li> aRow или aColumn меньше 1
	 * <li> aRows или aColumns больше {@linkplain matrix.IRange#rows() rows()} ({@linkplain matrix.IRange#columns() columns()})
	 */
	abstract ICell getCell(int aRow, int aColumn);
}
